package com.frame.jfinal.controller;

import java.util.Date;
import java.util.List;

import net.sf.json.JSONObject;

import com.frame.config.SystemParamsConfig;
import com.frame.config.SystemParamsConfig.ManagerParam;
import com.frame.hander.ClientHander;
import com.frame.hander.ClientHander.Client;
import com.frame.jfinal.render.RenderValidateCode;
import com.frame.jfinal.service.RootService;
import com.frame.jfinal.validator.LoginValideValidator;
import com.frame.jfinal.validator.RegisterValidator;
import com.jfinal.aop.Before;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.system.model.LoginLog;
import com.system.model.User;


/**
 * @author LRC
 * @createDate 2015年5月16日
 * @description 系统框架总控制
 */
public class RootController extends Controller {

	/*******************************************
	 * 功能描述：首页
	 *******************************************
	 * @createDate 2015-9-11 by LRC 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public void main(){
		// TODO 查询我的首页显示数据
		
		render("main.html");
	}
	
	/*******************************************
	 * 功能描述：主页
	 *******************************************
	 * @createDate 2015-9-11 by LRC 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public void index() {
		Object user = getSession().getAttribute("user");
		if(user==null){
			//创建token
			createToken();
			//用户未登录跳转到登录页面
			render("login.html");
		}else{
			User u = null;
			if(user instanceof User){
				u = (User) user;
			}else{
				//系统异常
				renderError(500);
			}
			//获取用户菜单权限
			List<Record> nav = RootService.getUserMenu(u);
			setAttr("nav", nav);
			//返回主界面
			render("index.html");
			/**
			//根据用户角色的类别跳转到不同的主页
			String userType = u.getStr("userType");
			switch (userType) {
			case "manager":
				Computer cp = SystemInfoHander.getComputerInfo();
				setAttr("cpInfo", cp);
				render("index.html");
				break;
			case "stadiumMgr":
				render("stadium/index.html");
				break;
			default:
				break;
			}
			**/
		}
		
	}

	/*******************************************
	 * 功能描述：获取验证码
	 *******************************************
	 * @createDate 2015-9-11 by LRC 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public void getValidateCode() {
		//render(new CaptchaRender("validateCode"));
		RenderValidateCode render = new RenderValidateCode();
		render(render);
	}
	
	/*******************************************
	 * 功能描述：进行验证码验证
	 *******************************************
	 * @createDate 2015-9-11 by LRC 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public void validateCode(){
		String validateCode = getPara("validateCode");
		if(validateCode==null){
			renderJson(false);
			return;
		}
		//转成大写
		validateCode=validateCode.toUpperCase();
		//boolean valid = CaptchaRender.validate(this, validateCode, "validateCode");
		Object _validateCode = getRequest().getSession().getAttribute("validateCode");
		if(_validateCode==null){
			renderJson(false);
			return;
		}
		boolean valid = validateCode.equals(_validateCode);
		renderJson(valid);
	}
	
	/*******************************************
	 * 功能描述：用户登录操作，首先执行登录验证
	 *******************************************
	 * @createDate 2015-9-11 by LRC 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	@Before(LoginValideValidator.class)
	public void login(){
		//获取前台参数
		String userCode = getPara("userCode");
		String password = getPara("password");
		//登录验证
		JSONObject data = new JSONObject();
		User u = RootService.validateLogin(userCode,password);
		if(u==null){
			//登录失败
			data.put("message", "登录失败，登录参数异常");
			data.put("result", false);
		}else{
			String msg = null;
			LoginLog log = new LoginLog();
			Client client = ClientHander.getIp(this);
			log.set("userCode", userCode).set("userName", u.get("userName"))
			.set("loginTime", new Date()).set("loginHost", client.host)
			.set("loginIp", client.ip).set("loginMac", client.mac);
			//检查账号状态
			//判断账号是否被锁
			if(User.dao.isLocked(userCode)){
				msg = "登录失败，账号已被锁定，请稍等片刻后重试！";
				log.set("result", 0).set("log", msg);
				data.put("message", msg);
				data.put("result", false);
			}else if(u.getInt("loginFailedNum")!=0){
				//判断是否超过锁定次数
				ManagerParam p = SystemParamsConfig.getInstance().getManagerParam();
				msg = String.format("登录失败%d次，失败%d次后账户将被锁定！", u.getInt("loginFailedNum"),p.loginFailedNum);
				log.set("result", 0).set("log", msg);
				data.put("message", msg);
				data.put("result", false);
			}else{
				// TODO 是否限制只能在一处登录
				//向session中加入当前用户
				getSession().setAttribute("user", u);
				//登录成功
				data.put("result", true);
				log.set("result", 1).set("log", "登录成功！");
			}
			log.save();
		}
		renderJson(data);
	}
	
	/**
	 * @updateTeim 2015年5月21日下午11:32:50
	 * @description 用户登出操作
	 */
	public void logout(){
		User u = (User) getSession().getAttribute("user");
		//设置session为null
		//getSession().setAttribute("user", null);
		//清空session
		getSession().invalidate();
		//用户状态设置为登出
		RootService.userLogout(u);
		//返回到登录界面
		redirect("/");
	}
	
	/**
	 * @updateTeim 2015年5月24日上午9:13:49
	 * @description 跳转到注册界面 
	 */
	@Before(RegisterValidator.class)
	public void register(){
		String type = getPara("type");
		//更加注册类型返回对应的注册界面
		switch(type){
			case "55CD5Zy6566h55CG5rOo5YaM"://球场管理注册
				render("merchantRegister.html");
				break;
			case "5o+Q5Lqk55CD5Zy6566h55CG5rOo5YaM"://提交球场管理注册
				//获取注册信息
				JSONObject data = RootService.groundMgrRegister(this);
				renderJson(data);
				break;
			default:
				renderError(404);
		}
	}
	
	/**
	 * @updateTeim 2015年5月24日下午12:10:33
	 * @description 验证登录名是否存在 
	 */
	public void validUserCode(){
		String userCode = this.getPara("userCode");
		Long count = Db.findFirst("select count(1) ct from sys_mgr_user where userCode=?",
				userCode).getLong("ct");
		if (count != null && count > 0) {
			// 如果登录名已经存在则返回false
			this.renderJson(false);
		} else {
			this.renderJson(true);
		}
	}
	
}
